package com.wxp.demo03.cases;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.wxp.demo03.R;
import com.wxp.demo03.util.LogUtils;
import com.wxp.demo03.util.StringUtils;

/**
 * 6计算器案例
 */
public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener {

    /**
     * 结果文本
     */
    private TextView tv_result;
    /**
     * 第一个操作数
     */
    private String firstNum = "";
    /**
     * 运算符
     */
    private String operator = "";
    /**
     * 第二个操作数
     */
    private String secondNum = "";
    /**
     * 当前的计算结果
     */
    private String result = "";
    /**
     * 显示的文本内容
     */
    private String showText = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        this.setTitle("6计算器案例");
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_calculator);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.calculator), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });


        // 从布局文件中获取名叫tv_result的文本视图
        tv_result = findViewById(R.id.tv_result);
        // 下面给每个按钮控件都注册了点击监听器
        findViewById(R.id.btn_cancel).setOnClickListener(this);
        // “除法”按钮
        findViewById(R.id.btn_divide).setOnClickListener(this);
        // “乘法”按钮
        findViewById(R.id.btn_multiply).setOnClickListener(this);
        // “清除”按钮
        findViewById(R.id.btn_clear).setOnClickListener(this);
        // 数字7
        findViewById(R.id.btn_seven).setOnClickListener(this);
        // 数字8
        findViewById(R.id.btn_eight).setOnClickListener(this);
        // 数字9
        findViewById(R.id.btn_nine).setOnClickListener(this);
        // “加法”按钮
        findViewById(R.id.btn_plus).setOnClickListener(this);
        // 数字4
        findViewById(R.id.btn_four).setOnClickListener(this);
        // 数字5
        findViewById(R.id.btn_five).setOnClickListener(this);
        // 数字6
        findViewById(R.id.btn_six).setOnClickListener(this);
        // “减法”按钮
        findViewById(R.id.btn_minus).setOnClickListener(this);
        // 数字1
        findViewById(R.id.btn_one).setOnClickListener(this);
        // 数字2
        findViewById(R.id.btn_two).setOnClickListener(this);
        // 数字3
        findViewById(R.id.btn_three).setOnClickListener(this);
        // 求倒数按钮
        findViewById(R.id.btn_reciprocal).setOnClickListener(this);
        // 数字0
        findViewById(R.id.btn_zero).setOnClickListener(this);
        // “小数点”按钮
        findViewById(R.id.btn_dot).setOnClickListener(this);
        // “等号”按钮
        findViewById(R.id.btn_equal).setOnClickListener(this);
        // “开平方”按钮
        findViewById(R.id.ib_sqrt).setOnClickListener(this);
    }

    /**
     * 点击事件
     *
     * @param v 视图对象
     */
    @Override
    public void onClick(View v) {
        String inputText;
        // 如果是开根号按钮
        if (v.getId() == R.id.ib_sqrt) {
            inputText = "√";
        } else {
            // 除了开根号之外的其他按钮
            inputText = ((TextView) v).getText().toString();
        }
        int id = v.getId();
        if (id == R.id.btn_clear) {
            // 点击了清除按钮
            clear();
        } else if (id == R.id.btn_cancel) {
            // 点击了取消按钮
            LogUtils.info("点击取消按钮~");
            //结果默认为0
            refreshText("0");
        } else if (id == R.id.btn_plus
                || id == R.id.btn_minus
                || id == R.id.btn_multiply
                || id == R.id.btn_divide) {
            // 加减乘除四则运算
            // 点击了加、减、乘、除按钮
            operator = inputText;
            // 运算符
            refreshText(showText + operator);
        } else if (id == R.id.btn_equal) {
            // 点击了等号按钮
            double calculate_result = calculateFour();
            if ((StringUtils.isEmpty(showText) || "0".equals(showText))
                    && calculate_result == 0) {
                refreshText("0");
                return;
            }
            //判断是否存在操作符
            if (StringUtils.isEmpty(operator)) {
                refreshText(showText);
                return;
            }

            refreshOperate(String.valueOf(calculate_result));
            refreshText(showText + "=" + result);
        } else if (id == R.id.ib_sqrt) {
            // 点击了开根号按钮
            double sqrt_result = Math.sqrt(Double.parseDouble(firstNum));
            refreshOperate(String.valueOf(sqrt_result));
            refreshText(showText + "√=" + result);
        } else if (id == R.id.btn_reciprocal) {
            // 点击了求倒数按钮
            double reciprocal_result = 1.0 / Double.parseDouble(firstNum);
            refreshOperate(String.valueOf(reciprocal_result));
            refreshText(showText + "/=" + result);
        } else {
            // 点击了其他按钮，包括数字和小数点
            if (!result.isEmpty() && operator.isEmpty()) {
                // 上次的运算结果已经出来了
                clear();
            }
            // 无运算符，则继续拼接第一个操作数
            if (operator.isEmpty()) {
                firstNum = firstNum + inputText;
            } else {
                // 有运算符，则继续拼接第二个操作数
                secondNum = secondNum + inputText;
            }
            // 整数不需要前面的0
            if (showText.equals("0") && !inputText.equals(".")) {
                refreshText(inputText);
            } else {
                refreshText(showText + inputText);
            }
        }
    }

    /**
     * 加减乘除四则运算，返回计算结果
     *
     * @return 计算结果
     */
    private double calculateFour() {
        if (StringUtils.isEmpty(firstNum)) {
            firstNum = "0";
        }
        if (StringUtils.isEmpty(secondNum)) {
            secondNum = "0";
        }
        return switch (operator) {
            case "＋" -> Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
            case "－" -> Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
            case "×" -> Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
            //默认为除法
            default -> {
                //如果被除数为0直接返回0
                if ("0".equals(secondNum)) {
                    yield 0;
                }
                yield Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
            }
        };
    }

    /**
     * 清空并初始化
     */
    private void clear() {
        refreshOperate("");
        refreshText("");
    }

    /**
     * 刷新运算结果
     *
     * @param new_result 新结果
     */
    private void refreshOperate(String new_result) {
        result = new_result;
        firstNum = result;
        secondNum = "";
        operator = "";
    }

    /**
     * 刷新文本显示
     *
     * @param text 显示文本
     */
    private void refreshText(String text) {
        showText = text;
        tv_result.setText(showText);
    }
}